home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9207.ZIP / ACOMP.ZIP / PROLOGUE.MAC < prev    next >
Text File  |  1992-04-06  |  5KB  |  271 lines

  1. ;; A header macro file that defines a lot of common useful macros when
  2. ;; programming in assembly.  Supports conditional assembly for taking
  3. ;; advantage of 80286 opcodes.
  4.  
  5. IS286    equ    1        ;; True if taking advantage of 80286 opcodes.
  6.  
  7. IF    IS286
  8. P286
  9. ENDIF
  10.  
  11. Macro     SETUPSEGMENT
  12.  
  13. SEGMENT _TEXT    PARA PUBLIC 'CODE'
  14.     ASSUME    CS:_TEXT
  15.  
  16.     Endm
  17.  
  18. Struc    SEG_OFF
  19.  
  20. POFF    dw    ?
  21. PSEG    dw    ?
  22.  
  23.     Ends
  24.  
  25. UNION    FARPTR
  26.  
  27. DPTR    dd    ?
  28. XPTR    SEG_OFF <>
  29.  
  30.     ENDS
  31.  
  32.  
  33. macro   ShiftR  REG,TIMES
  34. ;; 2 - shift a register right a number of times.
  35. IF      IS286
  36.         shr     REG,TIMES
  37. ELSE
  38.         REPT    TIMES
  39.     shr    REG,1
  40.         ENDM
  41. ENDIF
  42.         endm
  43.  
  44. macro   ShiftL  REG,TIMES
  45. ;; 3 - shift a register left a number of times
  46. IF      IS286
  47.         shl     REG,TIMES
  48. ELSE
  49.         REPT    TIMES
  50.     shl    REG,1
  51.         ENDM
  52. ENDIF
  53.         endm
  54.  
  55. macro    LSMUL
  56. ;; 4 - performs a long signed multiply AX,DX * BX,CX
  57.     LOCAL    @@HOP1,@@HOP2
  58. ;; Long signed multiply
  59. ;; Long #1: AX,DX
  60. ;; Long #2: BX,CX
  61.     push    si
  62.     xchg    si,ax
  63.     xchg    dx,ax
  64.     or    ax,ax
  65.     jz    @@HOP1
  66.     mul    bx
  67. @@HOP1: xchg    cx,ax
  68.     or    ax,ax
  69.     jz    @@HOP2
  70.     mul    si
  71.     add    cx,ax
  72. @@HOP2: xchg    si,ax
  73.     mul    bx
  74.     add    dx,cx
  75.     pop    si
  76.     endm
  77.  
  78. macro    LongShiftL TIMES
  79. ;; 5 - Shift left AX,DX times.
  80.     REPT TIMES
  81.     shl    ax,1
  82.     rcl    dx,1
  83.     ENDM
  84.     endm
  85.  
  86. macro    LongShiftR TIMES
  87. ;; 6 - Shifr right AX,DX times
  88.     REPT TIMES
  89.     sar    dx,1
  90.     rcr    ax,1
  91.     ENDM
  92.     endm
  93.  
  94. macro    ShiftAL REG,TIMES
  95. ;; 7 - shift arithmetic left register, times
  96. IF      IS286
  97.     sal    REG,TIMES
  98. ELSE
  99.         REPT    TIMES
  100.     sal    REG,1
  101.         ENDM
  102. ENDIF
  103.     endm
  104.  
  105. macro    ShiftAR REG,TIMES
  106. ;; 8 - Shifr arithmatic right register, times
  107. IF      IS286
  108.     sar    REG,TIMES
  109. ELSE
  110.         REPT    TIMES
  111.     sar    REG,1
  112.         ENDM
  113. ENDIF
  114.     endm
  115.  
  116. macro   PushI   VALUE
  117. ;; 9 - Push an immediat onto the stack.
  118. ;; Push Immediate
  119. IF      IS286
  120.         push    VALUE
  121. ELSE
  122.         mov     ax,VALUE
  123.         push    ax
  124. ENDIF
  125.         endm
  126.  
  127. macro   PushEA  DATA
  128. ;; 10 - Push an effective address onto the stack.
  129. ;; Push Effective address
  130. IF      IS286
  131.         push    offset DATA
  132. ELSE
  133.         mov     ax,offset DATA
  134.         push    ax
  135. ENDIF
  136.         endm
  137.         
  138. macro   PushFar DATA
  139. ;; 11 - Push far address (relative to DS) onto the stack.
  140.         push    ds              ; push the segment
  141.         PushEA  DATA            ; push the offset
  142.         endm
  143.  
  144. macro   PushAll
  145. ;; 12 - Push ALL registers onto the stack.
  146. ;; Save all registers
  147. IF      IS286
  148.         pusha                   ;; if a 286 machine use the pusha opcode
  149.         push    ds              ;; save segment DS
  150.         push    es              ;; save segment ES
  151. ELSE
  152.         push    ax              ;; if not 286 machine use normal method
  153.         push    bx
  154.         push    cx
  155.         push    dx
  156.         push    si
  157.         push    di
  158.         push    bp
  159.         push    ds
  160.         push    es
  161. ENDIF
  162.         endm
  163.  
  164. macro   PopAll
  165. ;; 13 - Pop all registers off of the stack.
  166. ;;; Restore all registers from a push all
  167. IF      IS286
  168.         pop     es
  169.         pop     ds
  170.         popa
  171. ELSE
  172.         pop     es
  173.         pop     ds
  174.         pop     bp
  175.         pop     di
  176.         pop     si
  177.         pop     dx
  178.         pop     cx
  179.         pop     bx
  180.         pop     ax
  181. ENDIF
  182.         endm
  183.  
  184. macro   DOSTerminate
  185. ;; 14 - Terminate back to DOS
  186.     mov    ah,4Ch
  187.         int     21h
  188.         endm
  189.  
  190. macro   DosTSR  LOC
  191. ;; 15 - Terminate and stay resident back to DOS
  192.         lea     dx,[LOC+100h]   ; (End of program plus PSP)
  193.         int     27h             ; Terminate and stay resident.
  194.         endm
  195.  
  196. macro   Message data
  197. ;; 16 - Print a '$' terminated string to the console
  198.     push    ax
  199.         mov     ah,9            ; Function 9 write string
  200.         lea     dx,[data]       ; Get the address of the message
  201.         int     21h             ; Send the message to the screen.
  202.     pop    ax
  203.         endm
  204.  
  205.  
  206.  
  207. macro   PENTER  STORAGE
  208. ;; 17 - Enter a procedue with storage space
  209. ;; Procedure enter, uses the 286/386 ENTER opcode
  210. IF      IS286
  211.         enter   STORAGE,0       ; nexting level, always zero.
  212. ELSE
  213.         push    bp
  214.         mov     bp,sp
  215.         IF      STORAGE
  216.         sub     sp,STORAGE
  217.         ENDIF
  218. ENDIF
  219.         endm
  220.  
  221. macro   PLEAVE
  222. ;; 18 - Exit a procedure with stack correction.
  223. IF      IS286
  224.         leave
  225. ELSE
  226.         mov     sp,bp
  227.         pop     bp
  228. ENDIF
  229.         endm
  230.  
  231. macro   PushCREGS
  232. ;; 19 - Save registers for C
  233.         push    es
  234.     push    ds   ;The Kernel is responsible for maintaining DS
  235.         push    si
  236.         push    di
  237.         cld
  238.         endm
  239.  
  240. macro   PopCREGS
  241. ;; 20 - Restore registers for C
  242.         pop     di
  243.         pop     si
  244.     pop    ds ;The Kernel is responsible for maintaining DS
  245.         pop     es
  246.         endm
  247.  
  248. ;; Macro used to insert breakpoints in code to invoke the debugger.  Using
  249. ;; the macro allows for easier searches to be done on debug invokations.
  250. Macro    DoDebug
  251.     int    3
  252.     endm
  253.  
  254. Macro    SwapSegs
  255.     push    es
  256.     push    ds
  257.     pop    es
  258.     pop    ds
  259.     endm
  260.  
  261.  
  262. Macro    CALLF procedure
  263. ;; This macro fakes a far call to a procedure which is near and dear to
  264. ;; us but defined as far.  This is done to avoid fixups and so that
  265. ;; kernel objects are COMable.    It is used when a kernel service, which
  266. ;; is defined as a far procedure, needs to be called locally.
  267.     push    cs
  268.     call    near ptr procedure
  269.     endm
  270.  
  271.